home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / smaltalk.lha / smalltalk-1.1.1 / Class.st < prev    next >
Text File  |  1991-09-12  |  7KB  |  258 lines

  1. "======================================================================
  2. |
  3. |   Class Method Definitions
  4. |
  5.  ======================================================================"
  6.  
  7.  
  8. "======================================================================
  9. |
  10. | Copyright (C) 1990, 1991 Free Software Foundation, Inc.
  11. | Written by Steve Byrne.
  12. |
  13. | This file is part of GNU Smalltalk.
  14. |
  15. | GNU Smalltalk is free software; you can redistribute it and/or modify it
  16. | under the terms of the GNU General Public License as published by the Free
  17. | Software Foundation; either version 1, or (at your option) any later version.
  18. | GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
  19. | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  20. | FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  21. | details.
  22. | You should have received a copy of the GNU General Public License along with
  23. | GNU Smalltalk; see the file COPYING.  If not, write to the Free Software
  24. | Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  
  25. |
  26.  ======================================================================"
  27.  
  28.  
  29. "
  30. |     Change Log
  31. | ============================================================================
  32. | Author       Date       Change 
  33. | sbyrne     16 May 90      Improved error checking: you now cannot create a
  34. |              subclass of a class whose type is not compatible
  35. |              (i.e. non-variable subclass of a variable byte
  36. |              class).
  37. |
  38. | sbyrne     16 May 90      Minor changes to support preserving class definitions
  39. |              as long as possible (i.e. if you re-invoke the class
  40. |              definition method, it tries to re-use the existing
  41. |              class if possible).
  42. |
  43. | sbyrne     13 Jan 90      Began experimental addition of actual class
  44. |              definitions. 
  45. |
  46. | sbyrne     25 Apr 89      created.
  47. |
  48. "
  49.  
  50. ClassDescription subclass: #Class
  51.          instanceVariableNames: 'classVariables sharedPools'
  52.          classVariableNames: ''
  53.          poolDictionaries: ''
  54.          category: nil.
  55.  
  56. Class comment: 
  57. 'I am THE class object.  My instances are the classes of the system' !
  58.  
  59.  
  60.  
  61. !Class methodsFor: 'accessing instances and variables'!
  62.  
  63. addClassVarName: aString
  64.     | sym |
  65.     sym _ aString asSymbol.    "### maybe this should remain a string? "
  66.     (classVariables includesKey: sym)
  67.         ifTrue: [ ^self error: 'class variable already present' ]
  68.     ifFalse: [ classVariables at: sym put: nil ]
  69. !
  70.  
  71. removeClassVarName: aString
  72.     "Removes the class variable from the class, error if not present, or
  73.      still in use."
  74.     | sym |
  75.     sym _ aString asSymbol.    "### maybe this should remain a string? "
  76.     " ### test for use in sub method "
  77.     (classVariables includesKey: sym)
  78.         ifTrue: [ classVariables removeKey: sym ]
  79.     ifFalse: [ self error: 'class variable not present' ]
  80. !
  81.  
  82. classPool
  83.     ^classVariables
  84. !
  85.  
  86. addSharedPool: aDictionary
  87.     (sharedPools includes: aDictionary)
  88.         ifTrue: [ ^self error: 'Attempt to add an already-present shared pool' ].
  89.     sharedPools _ sharedPools copyWith: aDictionary
  90. !
  91.  
  92. removeSharedPool: aDictionary
  93.     (sharedPools includes: aDictionary)
  94.         ifFalse: [ ^self error: 'Attempt to remove non-existent shared pool' ].
  95.     sharedPools _ sharedPools copyWithout: aDictionary
  96. !
  97.  
  98. initialize            "redefined in children (?)"
  99.     ^self
  100. !!
  101.  
  102.  
  103.  
  104. !Class methodsFor: 'testing'!
  105.  
  106. = aClass
  107.     "Returns true if the two class objects are to be considered equal."
  108.     ^name = aClass name
  109. !!
  110.  
  111.  
  112.  
  113. !Class methodsFor: 'instance creation'!
  114.  
  115.  
  116. subclass: classNameString
  117.   instanceVariableNames: stringInstVarNames
  118.   classVariableNames: stringOfClassVarNames
  119.   poolDictionaries: stringOfPoolNames
  120.   category: categoryNameString
  121.     | meta |
  122.     KernelInitialized ifFalse: [ ^nil ].
  123.     self isVariable
  124.     ifTrue: [ ^self error: 'cannot create a non-variable subclass 
  125. of a variable class' ].
  126.     meta _ self metaclassFor: classNameString.
  127.     ^meta name: classNameString
  128.             environment: Smalltalk
  129.         subclassOf: self
  130.         instanceVariableNames: stringInstVarNames
  131.         variable: false
  132.         words: true
  133.         pointers: true
  134.             classVariableNames: stringOfClassVarNames
  135.         poolDictionaries: stringOfPoolNames
  136.         category: categoryNameString
  137.         comment: nil
  138.         changed: nil
  139. !
  140.  
  141. variableSubclass: classNameString
  142.   instanceVariableNames: stringInstVarNames
  143.   classVariableNames: stringOfClassVarNames
  144.   poolDictionaries: stringOfPoolNames
  145.   category: categoryNameString
  146.     | meta |
  147.     KernelInitialized ifFalse: [ ^nil ].
  148.     self isVariable & (self isWords | self isBytes) 
  149.     ifTrue: [ ^self error: 'cannot create a variable subclass from a 
  150. non-pointer variable parent class' ].
  151.     meta _ self metaclassFor: classNameString.
  152.     ^meta name: classNameString
  153.             environment: Smalltalk
  154.         subclassOf: self
  155.         instanceVariableNames: stringInstVarNames
  156.         variable: true
  157.         words: true
  158.         pointers: true
  159.             classVariableNames: stringOfClassVarNames
  160.         poolDictionaries: stringOfPoolNames
  161.         category: categoryNameString
  162.         comment: nil
  163.         changed: nil
  164. !
  165.  
  166. variableWordSubclass: classNameString
  167.   instanceVariableNames: stringInstVarNames
  168.   classVariableNames: stringOfClassVarNames
  169.   poolDictionaries: stringOfPoolNames
  170.   category: categoryNameString
  171.     | meta |
  172.     KernelInitialized ifFalse: [ ^nil ].
  173.     self isVariable & (self isPointers | self isBytes) 
  174.     ifTrue: [ ^self error: 'cannot create a word subclass from a non-word 
  175. variable parent class' ].
  176.     meta _ self metaclassFor: classNameString.
  177.     ^meta name: classNameString
  178.             environment: Smalltalk
  179.         subclassOf: self
  180.         instanceVariableNames: stringInstVarNames
  181.         variable: true
  182.         words: true
  183.         pointers: false
  184.             classVariableNames: stringOfClassVarNames
  185.         poolDictionaries: stringOfPoolNames
  186.         category: categoryNameString
  187.         comment: nil
  188.         changed: nil
  189. !
  190.  
  191. variableByteSubclass: classNameString
  192.   instanceVariableNames: stringInstVarNames
  193.   classVariableNames: stringOfClassVarNames
  194.   poolDictionaries: stringOfPoolNames
  195.   category: categoryNameString
  196.     | meta |
  197.     KernelInitialized ifFalse: [ ^nil ].
  198.     self isVariable & (self isPointers | self isWords)
  199.     ifTrue: [ ^self error: 'Cannot create variable byte subclass from 
  200. non-byte parent class' ].
  201.     meta _ self metaclassFor: classNameString.
  202.     ^meta name: classNameString
  203.             environment: Smalltalk
  204.         subclassOf: self
  205.         instanceVariableNames: stringInstVarNames
  206.         variable: true
  207.         words: false
  208.         pointers: false
  209.             classVariableNames: stringOfClassVarNames
  210.         poolDictionaries: stringOfPoolNames
  211.         category: categoryNameString
  212.         comment: nil
  213.         changed: nil
  214. !!
  215.  
  216.  
  217.  
  218. !Class methodsFor: 'printing'!
  219.  
  220. printOn: aStream
  221.     self name printOn: aStream
  222. !
  223.  
  224. storeOn: aStream
  225.     self printOn: aStream
  226. !!
  227.  
  228.  
  229.  
  230. !Class methodsFor: 'private'!
  231.  
  232. setClassVariables: aDictionary
  233.     classVariables _ aDictionary
  234. !
  235.  
  236. setSharedPools: aDictionary
  237.     sharedPools _ aDictionary
  238. !
  239.  
  240. metaclassFor: classNameString
  241.     | className class |
  242.     className _ classNameString asSymbol.
  243.     class _ Smalltalk at: className 
  244.               ifAbsent: [ ^Metaclass subclassOf: self class ].
  245.     ^class class
  246. !
  247.  
  248. setSuperclass: aClass
  249.     self superclass == aClass
  250.     ifTrue: [ ^self ].    "don't need to change anything"
  251.     self superclass notNil    "remove any old knowledge of this class"
  252.     ifTrue: [ self superclass removeSubclass: self ].
  253.     self superclass: aClass.
  254.     aClass addSubclass: self
  255. !!
  256.